#ifndef ESTRATEGIAALMACENAMIENTO_H_
#define ESTRATEGIAALMACENAMIENTO_H_

#include "../Constantes.h"
#include "../Bytes.h"
#include "../claves/Key.h"
#include "../claves/TipoClave.h"
#include "../recursoDeAlmacenamiento/RecursoDeAlmacenamiento.h"

class FabricaCompuestos;
class Componente;
class Objeto;
class Iterador;

/*
 * Funcion: Estrategia para organizar los datos y poder almacenarlos y
 * recuperarlos.
 */
class EstrategiaAlmacenamiento {

private:
	/*
	 * Pre: -
	 * Pos: Agrega el Header en el archivo.
	 */
	virtual void completarHeader(Bytes& header) = 0;

protected:
	FabricaCompuestos* fabrica;
	RecursoDeAlmacenamiento* recurso;
	cantBytes tamanioHeader;
	cantBytes tamanioHeaderConPadding;
	cantBytes tamanioMetadata;
	string tipoArchivo;

public:

	/*
	 * Pre: -
	 * Pos: Crea una nueva instancia.
	 */
	EstrategiaAlmacenamiento(FabricaCompuestos* fabrica = NULL);

	/*
	 * Pre: -
	 * Pos: Libera los recursos instanciados.
	 */
	virtual ~EstrategiaAlmacenamiento();

	/*
	 * Pre: recurso distinto a nulo.
	 * Pos: Setea el recurso.
	 */
	void setRecurso(RecursoDeAlmacenamiento*);

	/*
	 * Pre: -
	 * Pos: Guarda los bytes.
	 */
	virtual bool guardar(const Bytes& bytes, long& numeroComponente) = 0;

	/*
	 * Pre: -
	 * Pos: En caso de hallarlo, devuelve los bytes del objeto indicado por la clave.
	 */
	virtual Bytes obtener(offset numeroComponente, Key clave = Key(), TipoClave* extractor = NULL) = 0;

	/*
	 * Pre: -
	 * Pos: Elimina el dato relacionado con la clave. Devuelve true si el dato se encontraba.
	 */
	virtual bool eliminar(offset numeroComponente, Key clave = Key(), TipoClave* extractor = NULL) = 0;

	/*
	 * Pre: -
	 * Pos: Indica si el header esta corrupto.
	 */
	virtual bool headerCorrupto() = 0;

	/*
	 * Pre: -
	 * Pos: Inicializa el archivo.
	 */
	void inicializarArchivo();

	/*
	 * Pre: -
	 * Pos: Devuelve un iterador para recorrer los datos almacenados.
	 * Nota: No se pueden agregar datos mientras el iterador se esta
	 * usando.
	 */
	virtual Iterador* getIterador() = 0;

	offset getTamanioHeader() const;

};

#endif /* ESTRATEGIAALMACENAMIENTO_H_ */
